#ifndef IO_H_
#define IO_H_

#include <cmath>

#include "Defines.h"
#include "CSVFile.h"

/*
 * =====================================================================================
 *        Class:  Data
 *  Description:  Classe que representa uma entrada/saída
 * =====================================================================================
 */
class Data
{

public:

    /*-----------------------------------------------------------------------------
     *  Constrói uma nova entrada/saída passando a quantidade de cada variável
     *-----------------------------------------------------------------------------*/
    Data(uint nInVars, uint nOutVars, int filetype, CSVFilePtr csv);

    /*-----------------------------------------------------------------------------
     *  Retorna o vetor de entradas
     *-----------------------------------------------------------------------------*/
    vdoublePtr& getInput() { return input; }

    /*-----------------------------------------------------------------------------
     *  Retorna o vetor de saídas
     *-----------------------------------------------------------------------------*/
    vdoublePtr& getOutput() { return output; }

    /*-----------------------------------------------------------------------------
     *  Retorna o valor de uma posicao do vetor de saídas
     *-----------------------------------------------------------------------------*/
    double getOutput(uint i) { return output->at(i); }

    /*-----------------------------------------------------------------------------
     *  Retorna o vetor de saídas da rede neural
     *-----------------------------------------------------------------------------*/
    vdoublePtr& getNeuralOutput() { return neuralOutput; }

    /*-----------------------------------------------------------------------------
     *  Seta valores de saída da rede neural
     *-----------------------------------------------------------------------------*/
    void setNeuralOutput(vdoublePtr out);

    /*-----------------------------------------------------------------------------
     *  Verifica se o cálculo da rede neural foi bem sucedido para esta entrada/saída
     *-----------------------------------------------------------------------------*/
    bool hasSucceeded(double tolerance);

    /*-----------------------------------------------------------------------------
     *  Imprime as entradas
     *-----------------------------------------------------------------------------*/
    void printInput();

    /*-----------------------------------------------------------------------------
     *  Imprime as saídas
     *-----------------------------------------------------------------------------*/
    void printOutput();

    /*-----------------------------------------------------------------------------
     *  Imprime as saídas da rede neural
     *-----------------------------------------------------------------------------*/
    void printNeuralOutput();

private:

    /*-----------------------------------------------------------------------------
     *  Vetor de entradas
     *-----------------------------------------------------------------------------*/
    vdoublePtr input;

    /*-----------------------------------------------------------------------------
     *  Vetor de saídas
     *-----------------------------------------------------------------------------*/
    vdoublePtr output;

    /*-----------------------------------------------------------------------------
     *  Vetor de saídas da rede neural
     *-----------------------------------------------------------------------------*/
    vdoublePtr neuralOutput;

};

/*-----------------------------------------------------------------------------
 *  Ponteiro
 *-----------------------------------------------------------------------------*/
typedef boost::shared_ptr<Data> DataPtr;

#endif /* IO_H_ */
